home *** CD-ROM | disk | FTP | other *** search
- /*
- dshell v3
-
- メインルーチン
- */
-
- #include "dsh.h"
- #include <signal.h>
-
-
- static uchar fkeyModeBak;
- static uchar skeyModeBak;
- static uchar curModeBak;
-
- static void
- handleBreak(int sig)
- {
- if (GETPDB() != (struct PDBADR *)_PSP)
- EXIT2(0x200);
- signal(sig, handleBreak);
- nouse_fnk();
- dout();
- B_PRINT("\x1a""中断しました\r\n");
- dsh_abort(0x200);
- }
-
-
- static volatile void
- dabort2(const char *mes)
- {
- printf("%s\n%s", mes, usage_mes);
- dsh_abort(1);
- }
-
-
- static ushort
- getColor(uchar *p)
- {
- int c, cl, j;
-
- if (*p != '-' && *p != '=') {
- dabort2("カラーコードの指定の前に、'-' をつけてください");
- }
- p++;
- if (strlen(p) != 4) {
- dabort2("カラーコードは16進数4桁で指定してください");
- }
- c = 0;
- for (j = 0; j < 4; j++) {
- cl = toupper(*p++);
- c <<= 4;
- if ('0' <= cl && cl <= '9') {
- c += cl - '0';
- } else if ('A' <= cl && cl <= 'F') {
- c += cl - 'A' + 10;
- } else {
- dabort2("カラーコードは16進数4桁で指定してください");
- }
- }
- return c;
- }
-
-
- void
- main(int argc, char *argv[])
- {
- int i, j;
- char *p, *fname = NULL, *bgCutName = NULL;
-
- B_COLOR(3);
- if (B_SFTSNS() & OPT2_KEY) {
- debugMode = TRUE;
- LEDMOD(2, 1);
- }
- setenv_and_export("DSHELLSTAT", "");
-
- fkeyModeBak = C_FNKMOD(-1);
- curModeBak = B_BPEEK((uchar *)0x993); // カーソルON/OFFモードを待避
- skeyModeBak = B_BPEEK((uchar *)0xbc1); // ソフトウェアキーボード表示モードを待避
-
- if (argc < 2) {
- dabort2(Sysmes);
- }
- for (i = 1; i < argc; i++) {
- p = argv[i];
- switch (*p) {
- case '-':
- case '/':
- switch (*++p) {
- case 't':
- case 'T':
- if (*++p == '\0') {
- if (++i == argc) {
- dabort2("タイトルの指定方法に誤りがあります");
- }
- p = argv[i];
- }
- if (strlen(p) > 40) {
- dabort2("タイトルネームは40文字までで指定して下さい");
- }
- Titlename = p;
- break;
- case '0': /* 96 */
- case '1': /* 桁 */
- case '2': /* 時 */
- case '3': /* 有 */
- case '4': /* 効 */
- j = *p++ - '0';
- ogr_col[j] = getColor(p);
- break;
- case '-':
- case '/':
- if (*p == *(p - 1)) {
- j = *(p + 1);
- if (j >= '1' && j <= '3')
- otx_col[j - '0'] = getColor(p + 2);
- }
- break;
- case 'k':
- case 'K':
- j = *++p - '0';
- if ((j < 0) || (j > 1)) {
- dabort2("キーボード使用フラグは0か1で指定してください");
- }
- Kflg = j;
- break;
- case 'j':
- case 'J':
- j = *++p - '0';
- if ((j < 0) || (j > 1)) {
- dabort2("ジョイスティック使用フラグは0か1で指定してください");
- }
- Jflg = j;
- break;
- case 'C':
- case 'c':
- j = *++p;
- if ((j != 'S') && (j != 's')) {
- dabort2("パラメータが違います\n");
- }
- j = *++p - '0';
- if ((j < 0) || (j > 1)) {
- dabort2("パラメータが違います\n");
- }
- CSpdUp = j;
- break;
- case 'R':
- case 'r':
- j = *++p;
- if ((j != 'W') && (j != 'w')) {
- dabort2("パラメータが違います\n");
- }
- j = *++p - '0';
- if ((j < 0) || (j > 1)) {
- dabort2("パラメータが違います\n");
- }
- Rwin_len = (j == 0) ? RW_HALF : RW_FULL;
- break;
- case 'o':
- case 'O':
- if (striEqu("mitmsg", p + 1)) {
- OmitMsgFlg = TRUE;
- }
- break;
- case 'G':
- case 'g':
- p++;
- if (*argv[i] == '-' && *p == '\0') {
- GMODE = 0;
- } else {
- switch (*p) {
- case '0':
- case '1':
- case '2':
- GMODE = *p - '0';
- break;
- }
- }
- break;
- case 'B':
- case 'b':
- if (*++p == '\0') {
- if (++i == argc)
- dabort2("");
- p = argv[i];
- }
- bgCutName = p;
- break;
- case 'D':
- case 'd':
- if (striEqu(p, "debug")) {
- debugMode = TRUE;
- LEDMOD(2, 1);
- break;
- }
- if (j = dinstrchr(++p, '=')) {
- int n = strlen(p);
- SHELLVAR *vp = malloc(sizeof(SHELLVAR) + n + 1);
- if (vp == NULL)
- dabort2("ヒープ容量が不足しています\n");
- strcpy(vp->name, p);
- vp->name[--j] = '\0'; // '=' -> '\0';
- vp->next = sysVarListHead;
- sysVarListHead = vp;
- }
- break;
- default:
- dabort2(Sysmes);
- break;
- }
- break;
- case '+':
- j = *++p;
- if ((j == 'G' || j == 'g') && (*(p + 1) == '\0')) {
- GMODE = 1;
- }
- break;
- default:
- if (fname == NULL) {
- fname = p;
- } else {
- /* -Tオプションなしのタイトル指定(昔の方式)も有効にする */
- Titlename = p;
- }
- }
- }
-
- if (fname == NULL) {
- dabort2("ファイル名を指定してください");
- }
- if (bgCutName != NULL) {
- if (loadBgCut(bgCutName) < 0)
- dabort2("CUTファイルが読み込めませんでした");
- bgCut = &cut[0];
- }
-
- check_joystick(); /* ジョイスティックチェック */
-
- if (init_bookmark())
- dabort2("calloc() error!");
-
- /* 画面色初期設定 */
- for (i = 0; i < 5; i++)
- gr_col[i] = ogr_col[i];
- for (i = 0; i < 4; i++)
- tx_col[i] = otx_col[i];
-
- B_PRINT(""); /* condrv バッファ記録off */
-
- OS_CUROF();
- vsync();
- B_WPOKE(VIDEOR2, 0);
- set_g_mode(GMODE);
- use_fnk();
- din(TRUE);
-
- LEDMOD(0, 0); // かなキー OFF
- LEDMOD(1, 0); // ローマ字キー OFF
- LEDMOD(2, 0); // コード入力キー OFF
- LEDMOD(4, 0); // INSキー OFF
- LEDMOD(6, 0); // 全角キー OFF
- {
- int x, y;
-
- mspos(&x, &y);
- if (y < 16)
- y = 16;
- else if (y >= 16*31)
- y = 16*31 - 1;
- if (x < 16)
- x = 16;
- setmspos(x, y);
- }
- signal(SIGINT, handleBreak);
- signal(SIGABRT, handleBreak);
-
- defGMODE = GMODE;
- dshell(fname);
-
- dend();
- }
-
-
- /*
- シェルおわり
- */
- volatile void
- dend()
- {
- use_fnk();
- if (fkeyModeBak != 3)
- nouse_fnk();
- dout();
- B_PRINT("");
- if (!OmitMsgFlg) {
- printf("\n%s\n", Sysmes);
- }
- dsh_abort(0);
- }
-
-
- /*
- condrv のバッファ登録をonにし、プロセス終了
- */
- volatile void
- dsh_abort(int ex_flag)
- {
- int x, y;
-
- setFont16(NULL);
- if (defFont16.table[0] != NULL)
- setHanFont16(defFont16.table[0]);
- LEDMOD(0, 0); // かなキー OFF
- LEDMOD(1, 0); // ローマ字キー OFF
- LEDMOD(2, 0); // コード入力キー OFF
- LEDMOD(6, 0); // 全角キー OFF
- B_COLOR(3);
- OS_CUROF();
- if (!curModeBak)
- OS_CURON();
- mspos(&x, &y);
- mouse(0);
- if (!skeyModeBak)
- mouse(4);
- setmspos(x, y);
- B_PRINT("");
- exit(ex_flag);
- }
-